package pers.xiaojun.boot.module.infra.service.file;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.constraints.NotEmpty;
import pers.xiaojun.boot.module.infra.controller.file.vo.file.FilePresignedUrlRespVO;
import pers.xiaojun.boot.module.infra.controller.file.vo.file.FileQueryReqVO;
import pers.xiaojun.boot.module.infra.controller.file.vo.file.FileSaveReqVO;
import pers.xiaojun.boot.module.infra.dao.entity.FileDO;

import java.util.Collection;
import java.util.List;

/**
 * 文件服务层
 *
 * @author xiaojun
 * @since 2025-11-13
 */
public interface FileService extends IService<FileDO> {


    /**
     * 保存文件信息
     *
     * @param saveVO 保存的信息
     * @return 文件信息
     */
    FileDO saveFile(FileSaveReqVO saveVO);

    /**
     * 保存文件，并返回文件的访问路径
     *
     * @param content   文件内容
     * @param name      文件名称，允许空
     * @param directory 目录，允许空
     * @param type      文件的 MIME 类型，允许空
     * @return 文件路径
     */
    String uploadFile(byte[] content, String name, String directory, String type);

    /**
     * 根据文件Id删除文件
     *
     * @param fileId 文件ID
     */
    void removeFileById(Long fileId);

    /**
     * 根据文件Id删除一批文件
     *
     * @param fileIds 文件Id列表
     */
    void removeFileByIds(Collection<Long> fileIds);

    /**
     * 根据文件Url删除文件
     *
     * @param url 文件Url
     *
     */
    void removeFileByUrl(String url);

    /**
     * 获取预签名信息
     *
     * @param directory 文件夹地址
     * @param filename  文件名
     * @return 预签名信息
     */
    FilePresignedUrlRespVO getFilePresignedUrl(String directory, String filename);

    /**
     * 分页/条件查询文件
     *
     * @param queryVO 查询条件
     * @return 分页数据
     */
    Page<FileDO> listFilesPage(FileQueryReqVO queryVO);

}
